package com.zenithmind.document.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.document.pojo.domain.DocumentVersion;
import com.zenithmind.document.pojo.vo.DocumentVersionVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 文档版本Mapper接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Mapper
public interface DocumentVersionMapper extends BaseMapper<DocumentVersion> {

    /**
     * 分页查询版本（包含关联信息）
     * 
     * @param page 分页参数
     * @param documentId 文档ID
     * @param creatorId 创建者ID
     * @return 分页结果
     */
    IPage<DocumentVersionVO> selectVersionPageWithDetails(Page<DocumentVersionVO> page,
                                                         @Param("documentId") String documentId,
                                                         @Param("creatorId") String creatorId);

    /**
     * 获取文档版本列表
     * 
     * @param documentId 文档ID
     * @param includeDeleted 是否包含已删除的版本
     * @return 版本列表
     */
    @Select("SELECT v.*, u.real_name as creator_name " +
            "FROM document_version v " +
            "LEFT JOIN user u ON v.creator_id = u.id " +
            "WHERE v.document_id = #{documentId} " +
            "AND (#{includeDeleted} = true OR v.deleted = 0) " +
            "ORDER BY v.create_time DESC")
    List<DocumentVersionVO> selectDocumentVersions(@Param("documentId") String documentId,
                                                  @Param("includeDeleted") Boolean includeDeleted);

    /**
     * 获取当前版本
     * 
     * @param documentId 文档ID
     * @return 当前版本
     */
    @Select("SELECT v.*, u.real_name as creator_name " +
            "FROM document_version v " +
            "LEFT JOIN user u ON v.creator_id = u.id " +
            "WHERE v.document_id = #{documentId} " +
            "AND v.is_current = 1 AND v.deleted = 0")
    DocumentVersionVO selectCurrentVersion(@Param("documentId") String documentId);

    /**
     * 获取版本详情
     * 
     * @param versionId 版本ID
     * @return 版本详情
     */
    DocumentVersionVO selectVersionDetail(@Param("versionId") String versionId);

    /**
     * 生成下一个版本号
     * 
     * @param documentId 文档ID
     * @return 版本号
     */
    String generateNextVersionNumber(@Param("documentId") String documentId);

    /**
     * 设置当前版本
     * 
     * @param documentId 文档ID
     * @param versionId 版本ID
     * @return 影响行数
     */
    int setCurrentVersion(@Param("documentId") String documentId,
                         @Param("versionId") String versionId);

    /**
     * 清除当前版本标识
     * 
     * @param documentId 文档ID
     * @return 影响行数
     */
    @Update("UPDATE document_version SET is_current = 0, update_time = NOW() " +
            "WHERE document_id = #{documentId} AND is_current = 1")
    int clearCurrentVersion(@Param("documentId") String documentId);

    /**
     * 比较两个版本
     * 
     * @param versionId1 版本1ID
     * @param versionId2 版本2ID
     * @return 比较结果
     */
    Object compareVersions(@Param("versionId1") String versionId1,
                          @Param("versionId2") String versionId2);

    /**
     * 获取版本变更历史
     * 
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 变更历史
     */
    @Select("SELECT v.*, u.real_name as creator_name " +
            "FROM document_version v " +
            "LEFT JOIN user u ON v.creator_id = u.id " +
            "WHERE v.document_id = #{documentId} AND v.deleted = 0 " +
            "ORDER BY v.create_time DESC " +
            "LIMIT #{limit}")
    List<DocumentVersionVO> selectVersionHistory(@Param("documentId") String documentId,
                                                @Param("limit") Integer limit);

    /**
     * 检查版本号是否存在
     * 
     * @param documentId 文档ID
     * @param versionNumber 版本号
     * @param excludeId 排除的版本ID
     * @return 是否存在
     */
    @Select("SELECT COUNT(*) > 0 FROM document_version " +
            "WHERE document_id = #{documentId} " +
            "AND version_number = #{versionNumber} " +
            "AND deleted = 0 " +
            "AND (#{excludeId} IS NULL OR id != #{excludeId})")
    Boolean checkVersionNumberExists(@Param("documentId") String documentId,
                                    @Param("versionNumber") String versionNumber,
                                    @Param("excludeId") String excludeId);

    /**
     * 复制版本
     * 
     * @param sourceVersionId 源版本ID
     * @param targetDocumentId 目标文档ID
     * @param newVersionNumber 新版本号
     * @param creatorId 创建者ID
     * @return 新版本ID
     */
    String copyVersion(@Param("sourceVersionId") String sourceVersionId,
                      @Param("targetDocumentId") String targetDocumentId,
                      @Param("newVersionNumber") String newVersionNumber,
                      @Param("creatorId") String creatorId);

    /**
     * 恢复版本
     * 
     * @param documentId 文档ID
     * @param versionId 版本ID
     * @param creatorId 创建者ID
     * @return 新版本ID
     */
    String restoreVersion(@Param("documentId") String documentId,
                         @Param("versionId") String versionId,
                         @Param("creatorId") String creatorId);

    /**
     * 获取版本统计信息
     * 
     * @param documentId 文档ID
     * @return 统计信息
     */
    Object selectVersionStatistics(@Param("documentId") String documentId);

    /**
     * 清理旧版本
     * 
     * @param documentId 文档ID
     * @param keepCount 保留数量
     * @return 清理数量
     */
    int cleanupOldVersions(@Param("documentId") String documentId,
                          @Param("keepCount") Integer keepCount);

    /**
     * 批量删除版本
     * 
     * @param versionIds 版本ID列表
     * @return 影响行数
     */
    int batchDeleteVersions(@Param("versionIds") List<String> versionIds);

    /**
     * 获取用户创建的版本
     * 
     * @param creatorId 创建者ID
     * @param limit 限制数量
     * @return 版本列表
     */
    @Select("SELECT v.*, u.real_name as creator_name, d.title as document_title " +
            "FROM document_version v " +
            "LEFT JOIN user u ON v.creator_id = u.id " +
            "LEFT JOIN document d ON v.document_id = d.id " +
            "WHERE v.creator_id = #{creatorId} AND v.deleted = 0 " +
            "ORDER BY v.create_time DESC " +
            "LIMIT #{limit}")
    List<DocumentVersionVO> selectUserVersions(@Param("creatorId") String creatorId,
                                              @Param("limit") Integer limit);

    /**
     * 搜索版本
     * 
     * @param keyword 关键词
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 版本列表
     */
    @Select("SELECT v.*, u.real_name as creator_name " +
            "FROM document_version v " +
            "LEFT JOIN user u ON v.creator_id = u.id " +
            "WHERE v.document_id = #{documentId} AND v.deleted = 0 " +
            "AND (v.version_name LIKE CONCAT('%', #{keyword}, '%') " +
            "OR v.description LIKE CONCAT('%', #{keyword}, '%') " +
            "OR v.change_log LIKE CONCAT('%', #{keyword}, '%')) " +
            "ORDER BY v.create_time DESC " +
            "LIMIT #{limit}")
    List<DocumentVersionVO> searchVersions(@Param("keyword") String keyword,
                                          @Param("documentId") String documentId,
                                          @Param("limit") Integer limit);

    /**
     * 获取版本大小统计
     * 
     * @param documentId 文档ID
     * @return 大小统计
     */
    @Select("SELECT " +
            "COUNT(*) as version_count, " +
            "SUM(file_size) as total_size, " +
            "AVG(file_size) as avg_size, " +
            "MAX(file_size) as max_size, " +
            "MIN(file_size) as min_size " +
            "FROM document_version " +
            "WHERE document_id = #{documentId} AND deleted = 0")
    Object selectVersionSizeStatistics(@Param("documentId") String documentId);
}
